package com.cskaoyan.service;

import com.cskaoyan.bean.bo.CartCheckedBo;
import com.cskaoyan.bean.pojo.Cart;
import com.cskaoyan.bean.bo.*;
import com.cskaoyan.bean.pojo.Coupon;
import com.cskaoyan.bean.pojo.UserAddress;
import com.cskaoyan.bean.vo.wx.CartCheckoutVo;
import com.cskaoyan.bean.vo.wx.CartIndexVo;
import com.cskaoyan.exception.CartException;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * @author yfsper233
 * @time 2021/7/10-17:21
 */
public interface CartService {
    /**
     * 根据用户id，购物车id，购物车的商品的选中状态查询购物车中的商品信息
     *
     * @param id          用户id
     * @param cartId      id为0，表示从购物车查询该用户所有记录 ，否则查询购物车指定id信息
     * @param onlyChecked true 表示只查找已选中状态的， false表示查找全部
     * @return
     */
    CartIndexVo queryCartIndex(Integer id, Integer cartId, Boolean onlyChecked);

    /**
     * 根据用户id和商品id，和商品的当前选中状态（checked）去更改其选中状态，
     * 如checked为0，改为checked为1并且要返回更改后的购物车信息
     *
     * @param id
     * @param checkedBo
     * @return
     */
    Integer updateCartCheckedStatus(Integer id, CartCheckedBo checkedBo);

    /**
     * @author: lsy
     * @title: queryCartById
     * @description: 根据cart的id查询cart信息
     * @param: [id]
     * @return: com.cskaoyan.bean.pojo.Cart
     */
    List<Cart> queryCartById(int id);
    Integer changeCartCheckedStatus(Integer id, CartCheckedBo checkedBo);

    /**
     * 查询下单前用户订单确认信息，包括地址信息，优惠券使用信息，商品数量，金额等等
     *
     * @param checkoutBo
     * @param bo
     * @param cartCheckedList
     * @return
     */
    CartCheckoutVo queryCartCheckoutInfo(Integer checkoutBo, CartCheckoutBo bo, CartIndexVo cartCheckedList) throws CartException;

    /**
     * 根据用户id查询购物车中商品数量
     *
     * @param userId
     * @return
     */
    Integer queryCartGoodsCount(Integer userId);

    /**
     * 添加购物车信息到cart表
     *
     * @param cartAddBo 商品id，数量，货品id
     * @param id        用户id
     * @return cartId
     */
    Integer addCart(CartAddBo cartAddBo, Integer id, Boolean isFastAdd);

    /**
     * 更新购物车中货品数量
     *
     * @param cartUpdateBo
     * @return 200 表示插入成功
     */
    Integer changeCartProductNum(CartUpdateBo cartUpdateBo);

    /**
     * 根据用户id和productId去逻辑删除product表和cart表，并且更新库存
     *
     * @param deleteList
     * @param id
     * @return 逻辑删除影响的行数
     */
    Integer removeCartByUserIdAndProductIds(List<Integer> deleteList, Integer id);

    /**
     * 根据购物车id去逻辑删除cart记录，并且不更新库存
     *
     * @param cardId
     * @return
     */
    Integer removeCartByCartId(Integer cardId);

    /**yfs
     * 根据用户id获取其第一条收货地址，默认的地址优先，
     */
    UserAddress queryUserAddressByUserId(Integer userId, Integer addressId);

    /**
     * yfs
     * 根据用户id和订单信息用查找可用优惠券信息
     * @param userId  用户id
     * @param cartInfo 订单信息
     * @param couponId -1不适用任何优惠券 0使用默认金额最大 >0:用户自己从可用列表中选中的
     * @return   可用优惠券列表
     */
    List<Coupon> queryAvailableCouponList(Integer userId, CartIndexVo cartInfo, Integer couponId);

    /**
     * 根据用户id去查询和团购规则id去查询团购优惠金额
     * @param userId 用户ID
     * @param groupRulesId 团购规则id
      * @return  团购优惠金额（设置的逻辑是可以和优惠券同时使用）
     */
    BigDecimal queryGroupDiscount(Integer userId,Integer groupRulesId,CartIndexVo cartInfo);

    /**
     * @author: lsy
     * @title: removeCartByIdList
     * @description: 根据idList逻辑删除cart
     * @param: [idList]
     * @return: int
     */
    int removeCartByIdList(ArrayList<Integer> idList);
}
